/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package traspasos.beans;

import entities.Almacen;
import entities.EnvioTraspasoMercancia;
import entities.LineaEnvioTraspasoMercancia;
import entities.LineaPeticionTraspasoMercancia;
import entities.Producto;
import entities.ProductoTalla;
import entities.Usuario;
import facades.EnvioTraspasoMercanciaFacade;
import facades.LineaPeticionTraspasoMercanciaFacade;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.ResourceBundle;
import javax.annotation.PostConstruct;
import javax.enterprise.event.Event;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;
import javax.transaction.Transactional;
import productos.datamodel.FiltroProductos;
import qualifiers.EventoEntidadCreada;
import qualifiers.UsuarioLogeado;

/**
 *
 * @author damfercer
 */
@Named
@ViewScoped
public class NuevoEnvioBean extends FiltroProductos {
    @Inject
    @EventoEntidadCreada
    Event<EnvioTraspasoMercancia> eventoNuevoEnvio;
    @Inject
    @UsuarioLogeado
    private Usuario usuario;
    @Inject
    LineaPeticionTraspasoMercanciaFacade lineaPeticionFacade;
    @Inject
    EnvioTraspasoMercanciaFacade envioTraspasoMercanciaFacade;
    private EnvioTraspasoMercancia envioTraspasoMercancia;
    private List<LineaEnvioTraspasoMercancia> lineasMostrar;
    
    @PostConstruct
    public void initialize(){
        lineasMostrar=new ArrayList<LineaEnvioTraspasoMercancia>();
        setEnvioTraspasoMercancia(new EnvioTraspasoMercancia());
        getEnvioTraspasoMercancia().setLineaEnvioTraspasoMercanciaList(new ArrayList<LineaEnvioTraspasoMercancia>());
        if(!usuario.getTipoUsuario().getDescripcion().equals("ADMIN") && !usuario.getTipoUsuario().getDescripcion().equals("DIRECCION") && !usuario.getTipoUsuario().getDescripcion().equals("LOGISTICA")){
            List<Almacen> almacenes=getUsuario().getAlmacenesReservaDeUsuario();
            for (Almacen almacen : almacenes) {
                List<LineaPeticionTraspasoMercancia> peticiones=lineaPeticionFacade.getLineasPeticionesPendientesDeAlmacen(almacen);
                for (LineaPeticionTraspasoMercancia lineaPeticionTraspasoMercancia : peticiones) {
                    LineaEnvioTraspasoMercancia lineaEnvio=new LineaEnvioTraspasoMercancia();
                    lineaEnvio.setEnvioTraspasoMercancia(getEnvioTraspasoMercancia());
                    lineaEnvio.setCantidad(0);
                    lineaEnvio.setLineaPeticionTraspasoMercancia(lineaPeticionTraspasoMercancia);
                    lineaEnvio.setProductoTalla(lineaPeticionTraspasoMercancia.getProductoTalla());
                    envioTraspasoMercancia.getLineaEnvioTraspasoMercanciaList().add(lineaEnvio);
                }
            }
            if(almacenes.size()==1){
                setAlmacenEnvio(almacenes.get(0));
            }
            else{
                lineasMostrar=new ArrayList<LineaEnvioTraspasoMercancia>(envioTraspasoMercancia.getLineaEnvioTraspasoMercanciaList());
            }
        }
    }
    
    public Boolean algunaLineaDiscrepaEnCantidad(){
        Boolean res=false;
        for (LineaEnvioTraspasoMercancia lineaEnvio : getEnvioTraspasoMercancia().getLineaEnvioTraspasoMercanciaList()) {
            if(lineaEnvio.getCantidad()>0 && lineaEnvio.getCantidad()<lineaEnvio.getLineaPeticionTraspasoMercancia().getCantidad()){
                return true;
            }
        }
        return res;
    }
    
    @Transactional
    public String guardar(){
        FacesContext context = FacesContext.getCurrentInstance();
        Locale locale=context.getViewRoot().getLocale();
        ResourceBundle rb = ResourceBundle.getBundle("messages", locale);
        
        List<LineaEnvioTraspasoMercancia> lineasEnvioLlenas=new ArrayList<LineaEnvioTraspasoMercancia>();
        if(!usuario.getTipoUsuario().getDescripcion().equals("ADMIN") && !usuario.getTipoUsuario().getDescripcion().equals("DIRECCION") && !usuario.getTipoUsuario().getDescripcion().equals("LOGISTICA")){
            for (LineaEnvioTraspasoMercancia lineaEnvio : lineasMostrar) {
                if(lineaEnvio.getCantidad()>0 && lineaEnvio.getLineaPeticionTraspasoMercancia().getAlmacenEnvio().equals(getEnvioTraspasoMercancia().getAlmacenEnvio())){
                    lineasEnvioLlenas.add(lineaEnvio);
                }
            }
        }
        else{
            for (LineaEnvioTraspasoMercancia lineaEnvio : lineasMostrar) {
                if(lineaEnvio.getCantidad()>0){
                    lineasEnvioLlenas.add(lineaEnvio);
                }
            }
        }
        if(lineasEnvioLlenas.isEmpty()){
            FacesMessage msg =new FacesMessage("No se puede crear un envío sin productos");
            msg.setSeverity(FacesMessage.SEVERITY_ERROR);
            context.addMessage(null, msg);
            context.renderResponse();
            return null;
        }
        if(!usuario.getTipoUsuario().getDescripcion().equals("ADMIN") && !usuario.getTipoUsuario().getDescripcion().equals("DIRECCION") && !usuario.getTipoUsuario().getDescripcion().equals("LOGISTICA")){
            Almacen almacenDestino=lineasEnvioLlenas.get(0).getLineaPeticionTraspasoMercancia().getPeticionTraspasoMercancia().getAlmacen();
            for (LineaEnvioTraspasoMercancia lineaEnvioTraspasoMercancia : lineasEnvioLlenas) {
                if(!lineaEnvioTraspasoMercancia.getLineaPeticionTraspasoMercancia().getPeticionTraspasoMercancia().getAlmacen().equals(almacenDestino)){
                    FacesMessage msg =new FacesMessage("El envío debe realizarse a un sólo almacen");
                    msg.setSeverity(FacesMessage.SEVERITY_ERROR);
                    context.addMessage(null, msg);
                    context.renderResponse();
                    return null;
                }
            }
            getEnvioTraspasoMercancia().setAlmacenDestino(almacenDestino);
        }
        getEnvioTraspasoMercancia().setLineaEnvioTraspasoMercanciaList(lineasEnvioLlenas);
        getEnvioTraspasoMercancia().setFechaCreacion(new Date());
        getEnvioTraspasoMercancia().setUsuarioCreador(getUsuario());
        envioTraspasoMercanciaFacade.create(getEnvioTraspasoMercancia());
        eventoNuevoEnvio.fire(envioTraspasoMercancia);
        this.setEnvioTraspasoMercancia(new EnvioTraspasoMercancia());
        return "/views/tienda/Traspasos?faces-redirect=true";
    }

    /**
     * @return the envioTraspasoMercancia
     */
    public EnvioTraspasoMercancia getEnvioTraspasoMercancia() {
        return envioTraspasoMercancia;
    }

    /**
     * @param envioTraspasoMercancia the envioTraspasoMercancia to set
     */
    public void setEnvioTraspasoMercancia(EnvioTraspasoMercancia envioTraspasoMercancia) {
        this.envioTraspasoMercancia = envioTraspasoMercancia;
    }

    /**
     * @return the lineasMostrar
     */
    public List<LineaEnvioTraspasoMercancia> getLineasMostrar() {
        return lineasMostrar;
    }

    /**
     * @param lineasMostrar the lineasMostrar to set
     */
    public void setLineasMostrar(List<LineaEnvioTraspasoMercancia> lineasMostrar) {
        this.lineasMostrar = lineasMostrar;
    }
    
    public Almacen getAlmacenEnvio(){
        return envioTraspasoMercancia.getAlmacenEnvio();
    }
    
    public void setAlmacenEnvio(Almacen a){
        getEnvioTraspasoMercancia().setAlmacenEnvio(a);
        lineasMostrar=new ArrayList<LineaEnvioTraspasoMercancia>();
        for (LineaEnvioTraspasoMercancia lineaEnvioTraspasoMercancia : envioTraspasoMercancia.getLineaEnvioTraspasoMercanciaList()) {
            if(lineaEnvioTraspasoMercancia.getLineaPeticionTraspasoMercancia().getAlmacenEnvio().equals(a)){
                lineasMostrar.add(lineaEnvioTraspasoMercancia);
            }
        }
    }

    /**
     * @return the usuario
     */
    public Usuario getUsuario() {
        return usuario;
    }

    /**
     * @param usuario the usuario to set
     */
    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }
    
    public void filtrarProductosTalla(){
        List<Producto> productos=this.filtrar();
        lineasMostrar=new ArrayList<LineaEnvioTraspasoMercancia>();
        for (Producto producto : productos) {
            Collections.sort(producto.getProductoTallaList());
            for (ProductoTalla productoTalla : producto.getProductoTallaList()) {
                LineaEnvioTraspasoMercancia lp=new LineaEnvioTraspasoMercancia();
                lp.setEnvioTraspasoMercancia(envioTraspasoMercancia);
                lp.setCantidad(0);
                lp.setProductoTalla(productoTalla);
                lineasMostrar.add(lp);
            }
        }
    }
}
